講完了OO的幾個概念,再來幾篇要來介紹好的OO原則跟設計方式。
今天先講很常聽到的『高內聚』、『低耦合』,大家都知道這是好的,但卻很難解釋什麼是內聚力,什麼是耦合,以及為什麼要高內聚,為什麼要低耦合。
1.高內聚
高內聚,簡單的說,就是有點『單一功能』的味道。
某個class或function負責處理的事情,已經無法再切分成別的class或function,稱為內聚力高。
2.低耦合
低耦合,簡單的說,就是相依性低。也有點類似『牽一髮動全身的程度』。
當一個需求異動,要改到很多地方,或是改了一個部分,很多地方都錯了,通常就是耦合性高。
3.舉例
高內聚低耦合如果要舉個例子來說,就像樂高積木。
樂高積木可以組合出各式各樣的模型,要重新組裝、異動,也都很有彈性。
(1)內聚,就是一塊一塊積木應該切分的很清楚、很細,且無法再切得更細。
如果是低內聚,就代表一塊積木都超大一塊的,當要組裝比較小的模型時,是無法拆開的。
假設有一塊積木是1號~10號這麼大,另一塊積木則是11號~20號。
但現在需求是需要組裝一個是5號~15號的模型出來,就做不到了。
除非再去重做一個5號~15號的積木。
所以如果是高內聚的設計方式,我們每一個單位都是一塊積木。
我們需要5號~15號,只需要把5號~15號這11塊積木組裝起來就可以了。
(2)耦合,就是積木與積木之間組裝的方式。
高耦合,就代表黏的拔不開。低耦合,就代表容易拔開組裝。
(所以樂高的積木是做的有凸起跟凹槽的,凸起與凹槽,就有點像介面)
如果是高耦合,就可能組裝積木的方式是用強力膠黏,當所有東西都用強力膠黏時,
假設以剛剛5號~15號積木的例子,現在8號要抽換成18號,是很難抽換的,得想辦法鋸斷強力膠黏的部分。
如果是低耦合,就可能是現在樂高的組合方式,透過積木之間的凸起與凹槽來做結合。或是像卡榫、螺絲一般,是方便組裝跟抽換的。只需要把8號前後拔開,再把18號放進來跟前後結合即可。
4.高內聚低耦合可達到的目的
需求異動容易抽換、修改與增加功能,而不會對太多既存功能造成影響。
每個功能重用性高、擴展性好、維護性高。
高內聚、低耦合是我們OO設計的目的,
而要盡量遵守的原則,則是SOLID原則。
實際上會面對到的設計問題,則可透過Design patterns來當作我們解決某個特定issue的藍圖。